最新内网横向移动工具发布 - Wmiexec-Pro
The following article is from Gcow安全团队 Author xiaoli@绝影小组
Intro
早于两年前,我基于wmihacker
免杀横向的思路,造轮子写了个wmipersist-Modify.py
的横向工具,相对于wmihacker
来说,无需配合mimikatz
的PTH
,即可进行PTH
,但是wmipersist.Modify.py
时间久了,也有许多不足之处,然后就有了这篇文章
改造点1:文件传输第一步-创建WMI类
文件传输部分是最难的,但是我看到t00ls
上的flystart
师傅,改了我的脚本,地址:
https://www.t00ls.com/viewthread.php?tid=68322&extra=&highlight=wmihacker&page=1
但是用的方法依旧是通过注册表传文件,这种方法有个坏处,就是写的文件不能大于512KB
,因为注册表的限制,我估计这个师傅是看到奇安信的SharpWMI
和香山师傅的WMIHACKER
项目来的灵感
奇安信的
SharpWMI
可以看到,该项目的Todo
,依旧想的是围绕注册表去进行修改,为此我们先把注册表传输文件放一边
WMIHACKER
的文件传输部分
令人意外的是,我们域渗透的龙头老大哥HarmJ0y
,于早些年前写了一个SharpWMI
项目,并且里面用到的文件上传方法是把数据写到一个自己创建的WMI Class
里面的properties
这个工具很不错,基本上该有的功能都有了,但是缺了PTH
,来,是时候拥抱impacket
了,我们也确立好了明确的目标,首先是创建wmi类
我们首先想到得就是impacket
远程调用 IWbemServices::PutClass
方法,然后boom
,就创建好了一个类,但是难题来了,PutClass
要求我们传入三个value
,且第一个pObject
类型的值已经难倒我了,因为实在不知道impacket
怎么去生成这个值
后面去看了
issues
,发现也有一个师傅问了相同的问题
期间自己也试了很多次方法,impacket
的wmi.py
也看了很久,无奈自己琢磨不出来,依旧创建不成类,难道就没有其他方法了吗?通过查找其他issues
,有另外的大哥是通过powershell
去创建一个wmi
类,但是还是没有采取他的方法,因为实战powershell
很容易被杀
但,回想起
WMIHACKER
的免杀横向思路,是通过事件订阅去执行VBS
,VBS
再去执行cmd
,达到的免杀横向目的,如果我们用VBS
去创建一个类,那也是免杀的,然后就按照思路去谷歌,你猜怎么着,答案就藏在微软的官方文档里
有了VBS脚本
,我们可以修改一下,变成我们想要的,如下图所示,CreationClassName
可以用来表示唯一key
值,而DebugOptions
可以用来存储数据,并且在创建完成类后,在里面接着创建一个叫Backup
的实例,用来判断是否创建类成功
类的properties
如下图所示
目前,创建类的思路已经齐全了,我们可以回到impacket
,自己定义一个创建类的方法,思路就是,用wmi
事件执行vbs
,然后使用iWbemServices.GetObject
方法去直接调用实例,判断类是否存在,存在的话,删除刚刚的事件订阅
impacket
除了iWbemServices.GetObject("win32_process")
的写法,还可可以直接调用实例 iWbemServices.GetObject('win32_process.Handle="0"')
删除类就好办了,直接调用 iWbemServices.DeleteClass
即可
改造点2:文件传输第二步-上传/下载
有了前面的思路,大致的上传和下载思路就出来了
上传文件:我们可以不用创建类,直接把文件base64编码
后,放入到vbs脚本
里面,然后事件订阅执行解码和释放文件,但是注意,impacket
在创建wmi实例
,如果string类型
的属性内容过大,传输会变得很慢很慢,同理,针对上传大文件,真的没什么好方法去解决速度
演示截图,上传了2兆
的文件
下载文件:下载文件的话,就用回VBS远程创建类
,然后VBS
把目标文件base64编码
,接着VBS
在新建的类里面创建一个实例,把内容写进入(注意不能写到key属性
里面)
然后用个函数封装起来,漂漂亮亮
演示截图,下载了2兆
的文件
添加模块:防火墙模块
主要是玩转MSFT_NetProtocolPortFilter
, MSFT_NetFirewallRule
, MSFT_NetFirewallProfile
这三个类,目前实现了启用禁用删除某条规则,MSFT_NetProtocolPortFilter
和 MSFT_NetFirewallRule
这个两个类属性里面的InstanceID
是关联的,然后动动手指,就可以写出一个基于端口查找防火墙规则的一个东西
演示如下,查找445端口
的规则,rule id
如下 {D13E226E-A4C0-4CD3-A4E1-17B5948121DE}
445
此时是联不通的
然后,直接禁用规则,445
联通了
你还可以删除它,之后就找不到了
还可以禁用全部防火墙的profile
聪明的你来到这里,一定发现了,怎么没有添加规则?这里就是就涉及到了impacket
的问题了,impacket
目前还不能发送string类型
的array
,如果你愿意研究一下,可以看看我提的issues
:https://github.com/fortra/impacket/issues/1514
还有一个问题,如果你的防火墙名称里面有中文,windows
数据包只支持latin-1
,如果不好采有中文,那会报错,解决办法就是,重写防火墙规则的名称(用latin-1编码
一遍结果看看有没有报错,报错代表有中文)
但是你可以更加恶意点,直接设置个空格,管理员怎么点都会报错
创建一个中文名字的防火墙规则,禁用端口445
获取规则ID
禁用
可以看到变成一片空了
点进去就报错
可能你会说,噢,那我改回来不就ok
了吗,但是遇到系统自定义的规则呢?改系统自定义的,留空,就纯恶心管理员了
留空后
添加模块:RDP Wrapper
RDP
这个就好解决了,设置个认证等级RPC_C_AUTHN_LEVEL_PKT_PRIVACY
,然后直接改对应的值,第一个1
代表开启rdp
,第二个1
代表同时配置防火墙
开启 Restricted Admin Mode
和查找 RDP端口
就好办了,直接调用 StdRegProv类
,一把梭
添加模块:WINRM Wrapper
WINRM
也很好弄,调用 win32_service
开启winrm服务
,然后同时调用上述防火墙模块配置好防火墙规则,系统内置了winrm
的防火墙规则的,只需要enable
它即可
添加模块:AMSI 绕过
这个模块只是在注册表创建一个名为 AmsiEnable
的键值对,实际有没有用还需要自己测试,来源于blackhat asia 2018
中Tal-Liberman
的分享(实际上有没有用,我还没测试过,看GhostPack
的SharpWMI
添加了这个,我也加上一个)
模块改进:命令执行
延续上一个项目 wmiexec-RegOut
中的 wmipersist-Modify.py
的思路,执行WMIHACKER
的VBS
模板,但是不同以往的是,这次选择把命令执行结果写到自己创建的类里面
注意,命令执行到这里不是程序卡住了,等一会即可,后续再去执行命令就很快了,应该是和EventFilter
的WQL语句
有关,需要排查一下
WMI爆破
恰好之前着手给CME
写了个WMI协议
一次经典的实战案例,有个内网里面445/139
全部关闭,管理员又恰好只开放了135
,不小心你就错过了很多咯
给CME官方
交PR
了,但是作者一直没通过 :
https://github.com/Porchetta-Industries/CrackMapExec/pull/657
Outro
程序中还有很多不足的地方,例如命令执行这里,看GhostPack
的SharpWMI
的历史commit
中,Ridter
师傅用的回显方法是把命令执行结果写到已存在的类且无关重要的属性中,后续也可以根据这个思路继续修改
Impacket
调用PutClass
实在是不懂怎么用本人只测试了有
Defender
/火绒
/360
的情况下横向,结果都没触发告警
项目链接:https://github.com/XiaoliChan/wmiexec-Pro
希望有看完的大哥觉得还不错的话可以给小弟我点个star
关注公众号后台回复 0001
领取域渗透思维导图,0002
领取VMware 17永久激活码,0003
获取SGK地址,0004
获取在线ChatGPT地址,0005
获取 Windows10渗透集成环境
扫描二维码加入交流群
往期推荐
利用SourceMap还原前端代码
国内知名黑客论坛t00ls遭遇15亿次CC攻击
从星链到ChatPGT,为什么我们总在误判美国科技与经济的发展?
记一次睡梦中某核酸检测系统的渗透测试
疑似境外黑客组织对CSDN、吾爱破解、bilibili等网站发起DDoS攻击
Fofa新产品 - 绕CDN溯源真实IP!